package org.tissou.client.Panel_Premier.operations_tab.Operations;

import org.tissou.client.Services.*;
import org.tissou.client.widgets.Label_MessageInformation;
import com.google.gwt.user.client.ui.*;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.datepicker.client.DateBox;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.i18n.client.DateTimeFormat;

import java.util.Date;

/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 03-Mar-2009
 * Time: 21:13:44
 * To change this template use File | Settings | File Templates.
 */
public class Operation_VirementInterne extends Operation_Base {

  DockPanel entrees1 = new DockPanel();
  DockPanel panel_compte_debourseur = new DockPanel();
  DockPanel panel_compte_receveur = new DockPanel();
  DockPanel entrees2 = new DockPanel();

  Label compte_debourseur_label= new Label("Compte a debiter :");
  Label compte_receveur_label= new Label("Compte a crediter :");
  ArbreDeComptes comptes_debourseur= new ArbreDeComptes(InformationsGlobales.personneLoguee.getNom());
  Boolean compte_debourseur_selectionne = false;
  ArbreDeComptes comptes_receveur= new ArbreDeComptes(InformationsGlobales.personneLoguee.getNom());
  Boolean compte_receveur_selectionne = false;
  MonnaieInfos monnaie_deboursee;
  MonnaieInfos monnaie_recue;

  //objets a mettre dans le Panel panel_meme_monnaie
  Label somme_Label = new Label("Somme a virer :");
  TextBox somme = new TextBox();
  CheckBox verifie = new CheckBox("Verifie?");

  //objets a mettre dans le Panel pas_meme_monnaie
  Label somme_recue_label = new Label("La somme recue sera :");
  TextBox somme_recue = new TextBox();
  Label taux_propose = new Label();
  Label taux_actuel = new Label();

  Button ok = new Button("OK");
  TauxConversionInfos taux = null;

  protected void MiseEnPlaceStyles() {
    taux_propose.addStyleName("defaultstyle");
    taux_actuel.addStyleName("defaultstyle");
    datePicker.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat("dd/MM/yyyy")));
    datePicker.addStyleName("defaultstyle");
    panel_compte_debourseur.addStyleName("dockPanelProprioComptes");
    panel_compte_receveur.addStyleName("dockPanelProprioComptes");
  }

  protected void MiseEnPlaceParametresWidgets() {
    somme_recue_label.setVisible(false);
    verifie.setVisible(false);
    somme_recue.setVisible(false);
    datePicker.setValue(new Date());
  }

  protected void MiseEnPlaceParametresPanel() {
    entrees1.add(date_Label,DockPanel.WEST);
    entrees1.add(datePicker, DockPanel.WEST);


    panel_compte_debourseur.add(compte_debourseur_label, DockPanel.NORTH);
    panel_compte_debourseur.add(comptes_debourseur, DockPanel.NORTH);
    panel_compte_debourseur.setCellHeight(compte_debourseur_label, "20px");
    panel_compte_debourseur.setVerticalAlignment(DockPanel.ALIGN_TOP);
    panel_compte_receveur.add(compte_receveur_label, DockPanel.NORTH);
    panel_compte_receveur.add(comptes_receveur, DockPanel.NORTH);
    panel_compte_receveur.setCellHeight(compte_receveur_label, "20px");
    panel_compte_receveur.setVerticalAlignment(DockPanel.ALIGN_TOP);

    entrees2.add(somme_Label,DockPanel.WEST);
    entrees2.add(somme,DockPanel.WEST);
    entrees2.add(verifie,DockPanel.WEST);
    entrees2.add(somme_recue_label, DockPanel.WEST);
    entrees2.add(somme_recue, DockPanel.WEST);
    entrees2.add(taux_actuel, DockPanel.WEST);
    entrees2.add(taux_propose, DockPanel.WEST);
  }

  protected void MiseEnPlaceActions() {
    datePicker.addValueChangeHandler(new ValueChangeHandler() {
        @Override
        public void onValueChange(ValueChangeEvent valueChangeEvent) {
             miseAJour();
        }
    });
    
     ok.addClickListener(new ClickListener(){
      public void onClick(Widget sender) {
        EnvoyerInformationServeur(FormerParametresOperation());
      }
    });


    comptes_receveur.addTreeListener(new TreeListener(){
      public void onTreeItemSelected(TreeItem item) {
        Compte c = DonnerCompte(item);
        if(c == null){
          monnaie_recue = null;
        }
        else {
          compte_receveur_selectionne = true;
          monnaie_recue = c.getMonnaie();
          if (compte_debourseur_selectionne) miseAJour();
        }
      }

      public void onTreeItemStateChanged(TreeItem item) {

      }
    });



    comptes_debourseur.addTreeListener(new TreeListener(){
      public void onTreeItemSelected(TreeItem item) {

        Compte c = DonnerCompte(item);
        if(c == null){
          monnaie_deboursee = null;
        }
        else {
          compte_debourseur_selectionne = true;
          monnaie_deboursee = c.getMonnaie();
          if (compte_receveur_selectionne) miseAJour();
        }
      }

      public void onTreeItemStateChanged(TreeItem item) {

      }
    });

    somme.addChangeListener(new ChangeListener(){

      public void onChange(Widget sender) {
        MiseAJourSommeRecue();
      }
    });
  }

  protected void MiseEnPlacePanels() {
    principal.add(message_information, DockPanel.NORTH);
    principal.setCellHeight(message_information, "40px");
    principal.add(entrees1,DockPanel.NORTH);
    principal.add(ok, DockPanel.SOUTH);
    principal.add(entrees2, DockPanel.SOUTH);
    principal.add(panel_compte_debourseur, DockPanel.WEST);
    principal.add(panel_compte_receveur, DockPanel.WEST);
    principal.setCellWidth(panel_compte_debourseur, "300px");
    principal.setCellWidth(panel_compte_receveur, "300px");
  }

  public Parametres FormerParametresOperation(){
    Parametres parametres;
    if (memeMonnaie()){
/*
  Operation_Virementinterne:
    Date Date = date;
    Boolean Verifie = verifie;
    OperationFactoryInfos.TypeOperation Typeoperation = OPERATION_VIREMENTINTERNE;

    List<CategorieInfos> Categories = void;
    List<ProprietaireInfos> Proprietaires = void;
    List<Compte> Comptes = compte debourseur, compte receveur;
    List<String> Libelles = new ArrayList<String>() = void;
    List<Dette> Dettes = new ArrayList<Dette>() = void;
    List<MonnaieInfos> Monnaies = new ArrayList<MonnaieInfos>() = void;
    List<Float> Sommes = new ArrayList<Float>() = somme concernee;
  */

       parametres = new Parametres(getDate(), verifie.isChecked(),
          OperationFactoryInfos.TypeOperation.OPERATION_VIREMENTINTERNE);

      try{parametres.ajouterCompte(comptes_debourseur.donneLeCompteSelectionne());
      } catch(MonException e){
        message_information.setMessage(Label_MessageInformation.Etat.MAUVAISEENTREE, e.getMessage());
        throw e;
      }
      try{parametres.ajouterCompte(comptes_receveur.donneLeCompteSelectionne());
      } catch(MonException e){
        message_information.setMessage(Label_MessageInformation.Etat.MAUVAISEENTREE, e.getMessage());
        throw e;
      }


      try {
        Float s = Float.valueOf(somme.getText().trim());
        parametres.ajouterSomme(s);
      } catch (NumberFormatException nfe) {
        MessageErreurEntree("La somme n'a pas ete rentree correctement. L'operation n'a pas ete entree.");
        throw new MonException("NumberFormatException: " + nfe.getMessage());
      }
    }

    else if (!memeMonnaie()){
/*
  Operation_Transfertmonnaiepersonnel:
    Date Date = date;
    Boolean Verifie = verifie;
    OperationFactoryInfos.TypeOperation Typeoperation = OPERATION_TRANSFERTMONNAIEPERSONNEL;

    List<CategorieInfos> Categories = void;
    List<ProprietaireInfos> Proprietaires = void;
    List<Compte> Comptes = compte debourseur, compte receveur;
    List<String> Libelles = new ArrayList<String>() = void;
    List<Dette> Dettes = new ArrayList<Dette>() = void;
    List<MonnaieInfos> Monnaies = new ArrayList<MonnaieInfos>() = void;
    List<Float> Sommes = new ArrayList<Float>() = somme deboursee, somme recue;
  */

      parametres = new Parametres(getDate(), false,
          OperationFactoryInfos.TypeOperation.OPERATION_TRANSFERTMONNAIEPERSONNEL);

      try{parametres.ajouterCompte(comptes_debourseur.donneLeCompteSelectionne());
      } catch(MonException e){
        message_information.setMessage(Label_MessageInformation.Etat.MAUVAISEENTREE, e.getMessage());
        throw e;
      }
      try{parametres.ajouterCompte(comptes_receveur.donneLeCompteSelectionne());
      } catch(MonException e){
        message_information.setMessage(Label_MessageInformation.Etat.MAUVAISEENTREE, e.getMessage());
        throw e;
      }
      
      try{
        Float s = Float.valueOf(somme.getText().trim());
        parametres.ajouterSomme(s);
      } catch (NumberFormatException nfe) {
        MessageErreurEntree("La somme n'a pas ete rentree correctement. L'operation n'a pas ete entree.");
        throw new MonException("NumberFormatException: " + nfe.getMessage());
      }
      try{
        Float s2 = Float.valueOf(somme_recue.getText().trim());
        parametres.ajouterSomme(s2);
      }catch (NumberFormatException nfe) {
        MessageErreurEntree("La somme recue n'a pas ete rentree correctement. L'operation n'a pas ete entree.");
        throw new MonException("NumberFormatException: " + nfe.getMessage());
      }

    }
    else throw new RuntimeException("La il y a un pb dans ton programme petite Clairette");
    return parametres;
  }

  private Boolean memeMonnaie(){
    if (monnaie_deboursee == null || monnaie_recue == null){
      MessageErreurEntree("Je ne peux pas obtenir la monnaie d'un des deux comptes. L'operation n'a pas ete entree.");
      throw new MonException("Tu n'as pas choisi les comptes !");
    }
    else return monnaie_deboursee.equals(monnaie_recue);
  }

  private void miseAJour(){
    if (memeMonnaie()){
      somme_recue_label.setVisible(false);
      somme_recue.setVisible(false);
      taux_propose.setVisible(false);
      taux_actuel.setVisible(false);
      verifie.setVisible(true);
    }
    else if (!memeMonnaie()){
      somme_recue_label.setVisible(true);
      somme_recue.setVisible(true);
      taux_propose.setVisible(true);
      taux_actuel.setVisible(true);
      verifie.setVisible(false);

      final AsyncCallback<TauxConversionInfos> c2 = new AsyncCallback<TauxConversionInfos>(){
          public void onFailure(Throwable caught) {
            MessageErreurServeur(caught.getLocalizedMessage());
            System.out.println("Tu n'as pas reussi a recuperer le taux");
          }

          public void onSuccess(TauxConversionInfos result) {
            taux = result;
            float f = taux.getTaux();
            taux_propose.setText("Le taux propose pour cette date est:"+f);
            MiseAJourSommeRecue();
            System.out.println("Congratulations Petite Clairette, tu as reussi a recuperer le taux !");
          }
        };
      TauxConversionService.App.getInstance().RetournerTaux(getDate(), monnaie_deboursee, monnaie_recue, c2);
    }
  }

  private void MiseAJourSommeRecue(){
    float somme_deboursee_entree;
    try {
      somme_deboursee_entree = Float.valueOf(somme.getText().trim());
    }
    catch(NumberFormatException nfe){
      somme_deboursee_entree = 0f;
    }
    if (taux == null){
      somme_recue.setText(String.valueOf(0f));
    }
    else{
      somme_recue.setText(String.valueOf(somme_deboursee_entree * taux.getTaux()));
    }
  }

@Override
public void InitialiserValeurs() {
	somme.setText("");
	
}
}
